/**
 * 模块配置议程
 * 该议程定义了模块的相关配置，包括模块名称、API 路径、会议室接口定义、表格列配置、检索配置和添加配置。
 * @module meetingRoomsConfig
 */
// 根据模块字段（注释部分的模块字段）生成接口、tableColumns、addParams、searchParams，需要注意的是需要严格按照当前已有的格式不要随便调整字段，相应的字段上都有备注的参数

import { ref } from 'vue'

export const moduleName = '签到'
export const moduleApi = '/api/player'

// 模块字段
// Execution:{
// "id": "number", // 唯一标识符
// "activityId": "string", // 活动ID
// "playerId": "string", // 用户ID
// "employeesUserId": "string", // 员工用户ID
// "remark": "string", // 备注
// "name": "string", // 用户姓名
// "mobile": "string", // 手机号
// "isCheck": "number" // 签到状态}

// 类型定义
export interface Execution {
  id: number
  activityId: string
  playerId: string
  employeesUserId: string
  remark: string
  name?: string
  mobile?: string
  isCheck?: number
}

/**
 * 表格列配置
 * @param {string} label - 列的标题
 * @param {string} prop - 对应的数据字段
 * @param {string} minWidth - 最小宽度（可选）
 * @param {object} dictionary - 字典对象，用于值的映射转换
 * @param {string} component - 使用的组件类型 (input, select, date, imgUpload, dateRange, timeRange, tags)
 * @param {string} componentName - 组件名称
 * @param {boolean} outOfLine - 是否允许超出换行
 * @param {boolean} fixed - 是否固定列
 * @param {boolean} sortable - 是否可排序
 * @param {boolean} noChecked - 是否不可选
 * @param {string} tagLabel - 组件为tags时，标签的属性
 */
export interface TableColumn {
  dictionary?: Record<string, string>
  label: string
  prop: string
  fixed?: boolean
  minWidth?: number | string
  sortable?: boolean
  component?: string
  componentProps?: Record<string, any> | ((row: any) => Record<string, any>)
  outOfLine?: boolean
  tagLabel?: string
  format?: (row: any) => any[]
  slotName?: string
}

export const tableColumns = ref<TableColumn[]>([
  // { label: '活动ID', prop: 'activityId', minWidth: '120px' },
  // { label: '用户', prop: 'name', minWidth: '120px' },
  // { label: '员工用户ID', prop: 'employeesUserId', minWidth: '150px' },
  // { label: '备注', prop: 'remark', minWidth: '200px' },
  { label: '用户姓名', prop: 'name', minWidth: '120px' },
  { label: '手机号', prop: 'mobile', minWidth: '120px' },
  {
    label: '住宿签到',
    prop: 'hotelCheckinInfo',
    minWidth: '180px',
    slotName: 'hotelCheckinInfo', // 使用插槽来自定义渲染
  },
  {
    label: '签到状态',
    prop: 'isCheck',
    minWidth: '100px',
    dictionary: {
      true: '已签到',
      false: '未签到',
    },
  },
  {
    label: '请假状态',
    prop: 'isLeave',
    minWidth: '100px',
    component: 'Tags',
    format: (row: any) => [row.isLeave ? '已请假' : '-'],
    componentProps: (row: any) => ({ types: [row.isLeave ? 'danger' : 'info'] }),
  },
  {
    label: '职务',
    prop: 'userInfo.postsMiddle',
    minWidth: '100px',
    component: 'Tags',
    format: (row: any) => {
      if (!row.userInfo?.postsMiddle) return []
      return Array.isArray(row.userInfo.postsMiddle) ? row.userInfo.postsMiddle.map((item: any) => item.posts?.name || '-') : []
    },
  },

  {
    label: '签到时间',
    prop: 'checkTime',
    minWidth: '100px',
  },
  {
    label: '签到方式',
    prop: 'checkType',
    minWidth: '100px',
  },
])

/**
 * 搜索参数配置
 * @param {string} label - 检索项的标题
 * @param {string} prop - 对应的数据字段
 * @param {string} component - 使用的组件类型 (input, select, switch, textarea)
 * @param {Array} options - 选项列表，用于select组件
 * @param {boolean} multiple - 是否支持多选
 * @param {any} default - 默认值
 * @param {string} placeholder - 占位符文本
 * @param {boolean} searchable - 是否可搜索
 */
export interface SearchParam {
  label: string
  prop: string
  component: 'input' | 'select' | 'switch' | 'textarea'
  options?: Array<{ label: string; value: any }>
  multiple?: boolean
  default?: any
  placeholder?: string
  searchable?: boolean
}

export const searchParams = (): SearchParam[] => [
  {
    label: '签到状态',
    prop: 'isCheck',
    component: 'select',
    placeholder: '签到状态',
    options: [
      { label: '已签到', value: '1' },
      { label: '未签到', value: '0' },
    ],
  },
  {
    label: '签到方式',
    prop: 'checkType',
    component: 'select',
    placeholder: '签到方式',
    options: [
      { label: '人工', value: '人工' },
      { label: '刷脸', value: '刷脸' },
      { label: '扫码', value: '扫码' },
      { label: '未到', value: '未到' },
    ],
  },
  {
    label: '用户姓名',
    prop: 'name',
    component: 'input',
    placeholder: '请输入用户姓名',
  },
  {
    label: '手机号',
    prop: 'mobile',
    component: 'input',
    placeholder: '请输入手机号',
  },
]

/**
 * 表单参数配置
 * @param {string} label - 表单项标题
 * @param {string} prop - 对应的数据字段
 * @param {string} component - 使用的组件类型
 * @param {string} placeholder - 占位符文本
 * @param {boolean} required - 是否必填
 * @param {Array} rules - 验证规则
 */
export interface FormParam {
  label: string
  prop: string
  component: 'input' | 'input-number' | 'select' | 'textarea'
  placeholder?: string
  required?: boolean
  rules?: any[]
}
/**
 * 获取添加参数
 * @param {string} label - 添加项的标题
 * @param {string} prop - 对应的数据字段
 * @param {string} required - 是否必填
 * @param {object} rule - 校验规则（可选），若不为 null，则表示该字段需要进行校验
 * @param {function} validator - 校验函数，若校验规则采用自动形式，需要通过validator传入校验函数
 * @param {number} colSpan - 列的跨度（可选）
 * @param {string} component - 使用的组件类型 ('input' | 'input-number' | 'select' | 'switch' | 'textarea' | 'date-picker' | 'time-picker' | 'time-picker' | 'img-upload')
 * @param {string} placeholder - 输入框的占位符（可选）
 * @param {boolean} disable - 是否禁用（可选）
 * @param {Array} options - 选项列表 (component 为select时必选)
 * @param {Array} optionsFun - 选项异步函数 (component 为select时必选)
 */
export const addParams = ref<FormParam[]>([
  {
    label: '播放器ID',
    prop: 'playerId',
    component: 'input',
    placeholder: '请输入播放器ID',
    required: true,
  },
  {
    label: '员工用户ID',
    prop: 'employeesUserId',
    component: 'input',
    placeholder: '请输入员工用户ID',
    required: true,
  },
  {
    label: '备注',
    prop: 'remark',
    component: 'textarea',
    placeholder: '请输入备注',
  },
])
